unit SaidaDM;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  ZDataset, ZSqlUpdate, ZSequence, MainDM, DB, QueryConditions, DataRecord;

type

  { TSaidaData }

  TSaidaData = class(TMainDataModule)
    SaidaItensDatasource: TDatasource;
    SaidaDatasource: TDatasource;
    SaidaItensZQuerycodigo_barra: TStringField;
    SaidaItensZQuerydesc_produto: TStringField;
    SaidaItensZQueryid_produto: TLargeintField;
    SaidaItensZQueryid_saida: TLargeintField;
    SaidaItensZQueryid_saida_produto: TLargeintField;
    SaidaItensZQueryquantidade: TFloatField;
    SaidaItensZQueryquantidade_minima: TFloatField;
    SaidaItensZQueryquantidade_saiu: TFloatField;
    SaidaItensZQuerysigla_unidade: TStringField;
    SaidaItensZQueryTotal: TFloatField;
    SaidaItensZQueryvalor: TFloatField;
    SaidaZQuery: TZQuery;
    EntradaZQuerydesc_cfop: TStringField;
    SaidaZQuerydata: TDateField;
    SaidaZQueryid_saida: TLargeintField;
    SaidaZQueryid_usuario: TLargeintField;
    SaidaZQuerynome_pessoa: TStringField;
    SaidaZQuerynota: TStringField;
    SaidaZQueryvalor: TFloatField;
    SaidaZSequence: TZSequence;
    SaidaZUpdate: TZUpdateSQL;
    SaidaItensZQuery: TZQuery;
    SaidaItensZSequence: TZSequence;
    SaidaItensZUpdate: TZUpdateSQL;
    AuxiliarZQuery: TZQuery;
    procedure DataModuleCreate(Sender: TObject);
    procedure SaidaItensZQueryCalcFields(DataSet: TDataSet);
    /// Abre o DataSet
    procedure OpenDataSet(); override;
    /// Fecha o DataSet
    procedure CloseDataSet(); override;
    /// Realiza busca
    /// @param(Condicoes são as condições para a busca)
    /// @param(Tabela é a tabela no banco de dados)
    procedure Search(Condicoes: TQueryConditions; Tabela: string); override;
    procedure SaidaAdicionaProduto(CodigoBarra: string; Quantidade: real);
    function BuscaProduto(CodigoBarra: string): TDataRecord;
    procedure SaidaRemoveProduto();
    function BuscaData(): string;
    procedure LimpaItens();

  end;
var
  SaidaData: TSaidaData;

implementation

uses ConnectionDM, MainFm;

procedure TSaidaData.DataModuleCreate(Sender: TObject);
begin
  MainDataSet := SaidaZQuery;
end;

procedure TSaidaData.SaidaItensZQueryCalcFields(DataSet: TDataSet);
begin
  //Na tabela Itens de Produtos possui um campo que é calculado
  SaidaItensZQueryTotal.Value :=
    SaidaItensZQueryvalor.AsFloat * SaidaItensZQueryquantidade_saiu.AsFloat;
 end;

procedure TSaidaData.OpenDataSet;
begin
  ConnectionData.EmptyQuery(SaidaZQuery, 'saida');
   SaidaItensZQuery.Open();
end;

procedure TSaidaData.CloseDataSet;
begin
  SaidaZQuery.Close();
end;

procedure TSaidaData.Search(Condicoes: TQueryConditions; Tabela: string);
begin
  ConnectionData.OpenQueryConditions(SaidaZQuery, Tabela, Condicoes);
end;

procedure TSaidaData.SaidaAdicionaProduto(CodigoBarra: string; Quantidade: real
  );
var
  Data: TDataRecord;
begin
  //Chama o método Busca Produto utilizando o código de barras
  Data := SaidaData.BuscaProduto(CodigoBarra);
  //Verifica se a quantidade que quer comprar é maior que a quantidade em estoque
  if Data <> nil then begin
    with SaidaItensZQuery do begin
      Insert();
      FieldByName('id_produto').AsString := Data.getValue('id_produto');
      FieldByName('codigo_barra').AsString := CodigoBarra;
      FieldByName('desc_produto').AsString := Data.getValue('desc_produto');
      FieldByName('valor').AsFloat := StrToFloatDef(Data.getValue('custo'),0);
      //Quantidade  é a quantidade que foi contada no estoque
      FieldByName('quantidade').AsFloat := Quantidade;
      //Quantidade que saiu do estoque
      FieldByName('quantidade_saiu').AsFloat:= (StrToFloatDef(Data.getValue('quantidade'),0)-Quantidade);
      SaidaItensZQuery.Post();
    end;
     //Atualiza o estoque
     with AuxiliarZQuery do begin
      Close();
      SQL.Clear();
      SQL.Add('UPDATE produto');
      SQL.Add('SET quantidade=:quantidade');
      SQL.Add('where codigo_barra =:codigo_barra;');
      ParamByName('codigo_barra').AsString := CodigoBarra;
      ParamByName('quantidade').AsFloat := Quantidade;
      ExecSQL();
    end;
    SaidaZQuery.Edit();
    //Fazer  o calculo primeiro na tabela
    SaidaZQuery.FieldByName('valor').AsFloat :=
      SaidaZQuery.FieldByName('valor').AsFloat + (SaidaItensZQuery.FieldByName('quantidade_saiu').AsFloat * StrToFloatDef(Data.getValue('custo'),0));
    SaidaZQuery.Post();
  end else begin
    ShowMessage('Produto Inexistente!');
  end;
end;


function TSaidaData.BuscaProduto(CodigoBarra: string): TDataRecord;
var
  Data: TDataRecord;
begin
  //Data := nil;
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('SELECT * FROM produto ');
    SQL.Add('WHERE codigo_barra=:codigo_barra');
    ParamByName('codigo_barra').AsString := CodigoBarra;
    Open();
    if RecordCount > 0 then begin
      Data := TDataRecord.Create;
      Data.ReadFromDataSet(AuxiliarZQuery);
      Result := Data;
    end else begin
      Result := nil;
    end;
  end;
end;

procedure TSaidaData.SaidaRemoveProduto();
begin
  if not (SaidaItensZQuery.BOF) and not (SaidaItensZQuery.EOF) then begin
    Edit();
    //!Fazer o calculo primeiro na tabela
    SaidaZQuery.FieldByName('valor').AsFloat :=
      SaidaZQuery.FieldByName('valor').AsFloat -
      ((SaidaItensZQuery.FieldByName('valor').AsFloat *
      SaidaItensZQuery.FieldByName('quantidade_saiu').AsFloat));
    Post();
    with AuxiliarZQuery do begin
      Close();
      SQL.Clear();
      SQL.Add('UPDATE produto');
      SQL.Add('SET quantidade=quantidade+:quantidade');
      SQL.Add('where codigo_barra =:codigo_barra;');
      ParamByName('codigo_barra').AsString :=
        SaidaItensZQuery.FieldByName('codigo_barra').AsString;
      ParamByName('quantidade').AsFloat :=
        SaidaItensZQuery.FieldByName('quantidade_saiu').AsFloat;
      ExecSQL();
    end;
    SaidaItensZQuery.Delete();
  end;
end;

function TSaidaData.BuscaData(): string;
var
  Data: string;
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('SELECT current_date as date');
    Open();
    Data := FieldByName('date').AsString;
    Result := Data;
  end;
end;

procedure TSaidaData.LimpaItens();
begin
   with SaidaItensZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select * FROM saida_produto limit 0');
    Open();
  end;
end;

{ TSaidaData }


initialization
  {$I saidadm.lrs}

end.
